ИППРПО

Docker. Сети

ИППРПО

План лекции

  • Введение в Docker-сети
  • Типы сетей в Docker
  • Управление сетями: команды и практика
  • Сетевые режимы и их особенности
  • Практические примеры настройки сетей
  • Безопасность и лучшие практики
  • Подведение итогов
Docker. Сети
ИППРПО

Введение в Docker-сети

  • Docker предоставляет встроенную систему сетевого управления для контейнеров
  • По умолчанию контейнеры изолированы от хоста и других контейнеров
  • Сети Docker позволяют:
    • Организовывать связь между контейнерами
    • Управлять маршрутизацией и политиками доступа
    • Обеспечивать безопасную коммуникацию
  • Docker использует модель Software Defined Networking (SDN)
Docker. Сети
ИППРПО

Зачем нужны Docker-сети?

  • Изоляция контейнеров по умолчанию — безопасность, но неудобство
  • Микросервисы требуют межконтейнерного взаимодействия:
    • Бэкенд → БД
    • Фронтенд → API
  • Необходимость гибкой настройки:
    • Внутренние и внешние сети
    • Поддержка DNS-имён между контейнерами
  • Поддержка различных сценариев: разработка, тестирование, продакшн
Docker. Сети
ИППРПО

Типы сетей в Docker

Docker поддерживает несколько типов сетей:

  • bridge — сетевой мост по умолчанию
  • host — прямое использование сетевого стека хоста
  • none — полная изоляция (без сети)
  • overlay — для мульти-хостовой связи (Swarm)
  • macvlan — назначение MAC-адреса контейнеру
  • ipvlan — аналог macvlan, но с одним MAC
  • Пользовательские плагины (CNI)
Docker. Сети
ИППРПО

Bridge-сети

  • Создаются автоматически при запуске Docker
  • Используется NAT для выхода в интернет
  • Контейнеры соединяются через виртуальный мост docker0
  • Плюсы:
    • Простота настройки
    • Поддержка DNS между контейнерами (если в одной пользовательской bridge-сети)
  • Минусы:
    • Ограниченная гибкость
    • Медленнее, чем host-режим
Docker. Сети
ИППРПО

Пример: Default Bridge

docker run -d --name web python:3.9 python app.py
  • Контейнер запускается в сети bridge по умолчанию
  • Нет DNS-имён (нельзя использовать имя web из другого контейнера)
  • Порты публикуются через -p
docker run --rm alpine ping -c 3 web
# не работает — DNS недоступен
Docker. Сети
ИППРПО

Пользовательские Bridge-сети

  • Рекомендуемый способ для связи контейнеров на одном хосте
  • Автоматическое DNS-именование
  • Изоляция групп контейнеров
  • Динамическое подключение/отключение
docker network create my-network
docker run -d --name db --network my-network redis
docker run -d --name app --network my-network my-app
Docker. Сети
ИППРПО

Пример: работа DNS в пользовательской сети

docker exec -it app ping db
# работает — db резолвится
  • Docker встраивает встроенный DNS-сервер
  • Каждый контейнер может обращаться по имени
  • Поддерживает alias:
docker run -d --name web --network my-network \
  --network-alias api.myapp.local nginx
Docker. Сети
ИППРПО

Host-сети

  • Контейнер использует сетевой стек хоста напрямую
  • Нет изоляции — порты доступны сразу
  • Полезно для:
    • Высокопроизводительных приложений
    • Мониторинга (например, Prometheus)
  • Недостатки:
    • Нет изоляции портов
    • Конфликты портов
    • Менее безопасно
docker run --network host nginx
Docker. Сети
ИППРПО

None-сети

  • У контейнера отсутствует сеть
  • Полезно для изолированных задач:
    • Запуск временного обработчика данных
    • Безопасные batch-задачи
docker run --network none alpine ip addr show
# вывод: только lo (loopback)
Docker. Сети
ИППРПО

Overlay-сети

  • Используется в Docker Swarm
  • Обеспечивает связь между контейнерами на разных хостах
  • Шифрование трафика (опционально)
  • Требует инициализации Swarm
docker swarm init
docker network create -d overlay my-overlay
Docker. Сети
ИППРПО

Macvlan-сети

  • Предоставляет контейнеру MAC-адрес и IP из физической сети
  • Контейнер выглядит как отдельное устройство в сети
  • Используется, когда нужен прямой доступ в LAN
  • Подходит для:
    • Промышленных приложений
    • Legacy-систем
docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 macnet

Требует правильной настройки интерфейса хоста

Docker. Сети
ИППРПО

IPvlan-сети

  • Аналог macvlan, но с разделяемым MAC-адресом
  • Подходит для сред с ограничениями на MAC-адреса
  • Поддерживает L2 и L3 режимы
  • Применяется в высоконагруженных и встроенных системах
Docker. Сети
ИППРПО

Управление сетями: команды

Команда Описание
docker network ls Список сетей
docker network create Создание сети
docker network rm Удаление сети
docker network inspect Информация о сети
docker network connect Подключение контейнера
docker network disconnect Отключение контейнера
Docker. Сети
ИППРПО

Пример: создание и использование сети

# Создаём сеть
docker network create backend

# Запускаем БД в сети
docker run -d --name redis --network backend redis:alpine

# Запускаем приложение
docker run -d --name api --network backend my-api

# API может обращаться к redis по имени
# внутри api-контейнера
import redis
r = redis.Redis(host='redis', port=6379)
Docker. Сети
ИППРПО

Подключение к нескольким сетям

Контейнер может быть подключён к нескольким сетям:

docker run -d --name worker my-worker

# Подключаем к разным сетям
docker network connect backend worker
docker network connect monitoring worker
  • Worker доступен в обеих сетях
  • DNS-имя зависит от сети
Docker. Сети
ИППРПО

Публикация портов и сети

  • Флаг -p или --publish пробрасывает порты наружу
  • Работает независимо от внутренней сети
  • Пример:
docker run -d --name web --network my-network -p 8080:80 nginx
  • Порт 80 в контейнере → 8080 на хосте
  • Другие контейнеры в my-network обращаются к web:80
Docker. Сети
ИППРПО

Docker Compose и сети

В docker-compose.yml сети задаются явно:

version: '3.8'
services:
  web:
    image: nginx
    networks:
      - frontend
  api:
    image: my-api
    networks:
      - backend
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
  backend:
  • Docker Compose автоматически создаёт сети
  • Сервисы в одной сети могут общаться по имени
Docker. Сети
ИППРПО

Пример: безопасная архитектура

networks:
  public:
    driver: bridge
  internal:
    driver: bridge
    internal: true  # нет доступа в интернет
  • web — в public и internal
  • api и db — только в internal
  • DB не доступна извне и не видит интернет
Docker. Сети
ИППРПО

Лучшие практики

  • Используйте пользовательские bridge-сети вместо default
  • Применяйте internal: true для приватных сервисов
  • Избегайте host-режима без острой необходимости
  • Назначайте осмысленные имена сетям
  • Ограничивайте доступ через политики сети (в Swarm/K8s)
Docker. Сети
ИППРПО

Безопасность сетей

  • Docker по умолчанию изолирует сети
  • Используйте iptables / firewalld для фильтрации
  • Включайте шифрование в overlay-сетях:
docker network create -d overlay \
  --opt encrypted \
  secure-net
  • Отключайте promiscuous mode на интерфейсах при необходимости
Docker. Сети
ИППРПО

Демонстрация (практика)

  1. Создать bridge-сеть
  2. Запустить контейнеры (nginx и alpine)
  3. Проверить связь по имени
  4. Подключить третий контейнер
  5. Посмотреть docker network inspect
  6. Удалить и пересоздать сеть
Docker. Сети
ИППРПО

Контрольные вопросы

  • Чем отличается default bridge от пользовательского?
  • Почему в default bridge не работает DNS?
  • Когда использовать host-сеть?
  • Как работает overlay в Swarm?
  • Как изолировать сервисы от интернета?
  • Можно ли объединить macvlan и bridge?
Docker. Сети
ИППРПО

Итоги

  • Docker предоставляет гибкую модель сетевого взаимодействия
  • Правильный выбор типа сети критичен для безопасности и производительности
  • Пользовательские bridge-сети — стандарт для локальных микросервисов
  • Поддержка DNS, alias, internal/external — мощные инструменты
  • Команды docker network и Compose позволяют легко управлять топологией
Docker. Сети